/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Expertos;

/**
 *
 * @author viqui
 */
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Vector;

public class ConvertirFechas {

    Calendar fechaInicial = new GregorianCalendar(2011, 1 - 1, 01);
    Calendar fechaFinal = new GregorianCalendar(2011, 1 - 1, 31);

    public static String sinComillas(String recibido) {
        String ult;
        int aux;
        aux = recibido.length();
        aux = aux - 1;
        ult = recibido.substring(1, aux);
        return ult;
    }

    public static String fechaAString(Date fecha) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String fechaSt = sdf.format(fecha);
        return fechaSt;
    }

    public static String fechaFormateada(Date fecha) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        String fechaSt = sdf.format(fecha);
        return fechaSt;
    }

    public static Date stringAFecha(String fecha) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date fechaDt;
        try {
            fechaDt = sdf.parse(fecha);
        } catch (ParseException ex) {
            fechaDt = new Date();
        }
        return fechaDt;
    }

    public static Date stringAHora(String hora) {
        SimpleDateFormat sdf = new SimpleDateFormat("kk:mm");
        Date horaDt;
        try {
            horaDt = sdf.parse(hora);
        } catch (ParseException ex) {
            horaDt = new Date();
        }
        return horaDt;
    }

    public static String horaAString(Date hora) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("kk:mm");
            String horaSt = sdf.format(hora);
            //return "'" + horaSt + "'";
            return horaSt;
        } catch (Exception e) {
            return "00:00";
        }

    }

    public static int restarHorasTardanzas(Date horainicio, Date horafin) {
        int diferencia = 0;
        /* COMPRUEBO SI ESTOY EN LA MISMA HORA */
        if (horainicio.getHours() == horafin.getHours()) {
            diferencia = horainicio.getMinutes() - horafin.getMinutes();
        }
        if (horainicio.getHours() > horafin.getHours()) {
            diferencia = (horainicio.getHours() - horafin.getHours()) * 60 + (horainicio.getMinutes() - horafin.getMinutes()) * (-1);
        }
        if (horainicio.getHours() < horafin.getHours()) {
            diferencia = ((horafin.getMinutes() - horainicio.getMinutes()) + (horafin.getHours() - horainicio.getHours()) * 60) * (-1);
        }
        return diferencia;
    }

    public static int restarFechas(Date dateinicio, Date datefin) {
        /* CREAMOS LOS OBJETOS GREGORIAN CALENDAR PARA EFECTUAR LA RESTA */
        GregorianCalendar date1 = new GregorianCalendar();

        GregorianCalendar date2 = new GregorianCalendar();
        date2.setTime(datefin); //dateFin es el objeto Date
        int rango;
        /* COMPROBAMOS SI ESTAMOS EN EL MISMO AÑO */
        if (date1.get(Calendar.YEAR) == date2.get(Calendar.YEAR)) {
            rango = date2.get(Calendar.DAY_OF_YEAR) - date1.get(Calendar.DAY_OF_YEAR);
        } else {
            /* SI ESTAMOS EN DISTINTO AÑO COMPROBAMOS QUE EL AÑO DEL DATEINI NO SEA BISIESTO
             * SI ES BISIESTO SON 366 DIAS EL AÑO
             * SINO SON 365
             */
            int diasAnyo = date1.isLeapYear(date1.get(Calendar.YEAR)) ? 366 : 365;
            /* CALCULAMOS EL RANGO DE AÑOS */
            int rangoAnyos = date2.get(Calendar.YEAR) - date1.get(Calendar.YEAR);
            /* CALCULAMOS EL RANGO DE DIAS QUE HAY */
            rango = (rangoAnyos * diasAnyo) + (date2.get(Calendar.DAY_OF_YEAR) - date1.get(Calendar.DAY_OF_YEAR));
        }
        return rango;
    }

    public static int getCantidadDiasHabiles(Calendar fechaInicial, Calendar fechaFinal) {
        int diffDays = 0;
        //mientras la fecha inicial sea menor o igual que la fecha final se cuentan los dias
        while (fechaInicial.before(fechaFinal) || fechaInicial.equals(fechaFinal)) {
            //si el dia de la semana de la fecha minima es diferente de sabado o domingo
            if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                //se aumentan los dias de diferencia entre min y max
                diffDays++;
            }
            //se suma 1 dia para hacer la validacion del siguiente dia.
            fechaInicial.add(Calendar.DATE, 1);
        }
        return diffDays;
    }

    public static List<Date> getDiasHabiles(Calendar fechaInicial, Calendar fechaFinal) {
        int i = 0;
        Vector<Date> dias = new Vector<Date>();
        //mientras la fecha inicial sea menor o igual que la fecha final se cuentan los dias
        while (fechaInicial.before(fechaFinal) || fechaInicial.equals(fechaFinal)) {
            //si el dia de la semana de la fecha minima es diferente de sabado o domingo
            if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                //se aumentan los dias de diferencia entre min y max
                dias.add(i, fechaInicial.getTime());
                i++;
            }
            //se suma 1 dia para hacer la validacion del siguiente dia.
            fechaInicial.add(Calendar.DATE, 1);
        }



        return dias;
    }

    public static int diferenciaEnDias2(Date fechaMayor, Date fechaMenor) {
        long diferencia = fechaMayor.getTime() - fechaMenor.getTime();
        long dias = diferencia / (1000 * 60 * 60 * 24);
        return (int) dias;
    }
}